package com.atguigu.spzx.cloud.order.service.impl;

import com.atguigu.spzx.cloud.order.entity.Order;
import com.atguigu.spzx.cloud.order.entity.User;
import com.atguigu.spzx.cloud.order.feign.UserFeignClient;
import com.atguigu.spzx.cloud.order.mapper.OrderMapper;
import com.atguigu.spzx.cloud.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    OrderMapper orderMapper;

    @Autowired
    RestTemplate restTemplate; //基于工具类的方式远程调用服务接口。  基于Http协议，支持Restful风格

    @Autowired
    UserFeignClient userFeignClient; //代理对象 $Proxy77

    @Override
    public Order findOrderByOrderId(Long orderId) {
        log.debug("方法开始了... orderId="+orderId);
        Order order = orderMapper.findOrderByOrderId(orderId);

        //需求：返回order对象的同时，也要返回订单所属用户
        //1.远程调用用户微服务
        Long userId = order.getUserId(); //订单表的外键

        //从配置中心拉取配置，进行负载均衡
        User user = userFeignClient.findUserByUserId(userId); //远程调用
        log.info("远程调用User服务接口成功了:数据="+user);
        //2.将用户对象封装到订单对象中 (数据封装)
        order.setUser(user);
        log.debug("方法结束了... order="+order);
        return order; //返回订单同时，用户信息页一并返回
    }


/*    @Override
    public Order findOrderByOrderId(Long orderId) {
        Order order = orderMapper.findOrderByOrderId(orderId);

        //需求：返回order对象的同时，也要返回订单所属用户
        //1.远程调用用户微服务
        Long userId = order.getUserId(); //订单表的外键

        //远程调用存在2个问题：
        //1.url路径写死 - 硬代码编程。  不利于代码维护。
        //2.远程服务可能集群，调用者写死url地址。没办法负载均衡。
        //User user = restTemplate.getForObject("http://localhost:10100/api/user/findUserByUserId/"+userId, User.class); //设置url地址和远程接口返回结果类型

        //从配置中心拉取配置，进行负载均衡
        User user = restTemplate.getForObject("http://spzx-cloud-user/api/user/findUserByUserId/"+userId, User.class); //设置url地址和远程接口返回结果类型

        //2.将用户对象封装到订单对象中 (数据封装)
        order.setUser(user);

        return order; //返回订单同时，用户信息页一并返回
    }*/
}
